package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import modelo.ModeloDetalleProducto;
import modelo.ModeloIngredientes;
import modelo.ModeloProductos;
import modelo.ModeloCategoria;
import vista.VistaProducto;
import Utilidades.ObjetoCombo;

public class ControladorProducto  extends WindowAdapter implements ActionListener, WindowListener {

	private VistaProducto vistaproducto;
	private ModeloProductos modeloproducto;
	private ModeloCategoria modelocategoria;
	private ModeloIngredientes modeloingrediente;
	private ModeloDetalleProducto modelodetalleproducto;
	
	private int fila = 0;
	
	public  void Limpiar(){
		
		fila=0;
		vistaproducto.getTxtCodigo().setText("");
		vistaproducto.getTxtDescripcion().setText("");
		vistaproducto.getTxtPrecio().setText("");
		vistaproducto.getTxtCosto().setText("");
		vistaproducto.getTxtcantidad().setText("");
		vistaproducto.getTxtCategoria().setSelectedItem(null);
		vistaproducto.getTxtIngredientes().setSelectedItem(null);
		
		for(int i=0; i<vistaproducto.getTabla().getRowCount(); i++)
			for(int f=0; f<4; f++)
				vistaproducto.getTabla().setValueAt("", i, f);
		
	}
	
	public  void limpiar2(){
		fila=0;
		vistaproducto.getTxtDescripcion().setText("");
		vistaproducto.getTxtPrecio().setText("");
		vistaproducto.getTxtCosto().setText("");
		vistaproducto.getTxtcantidad().setText("");
		vistaproducto.getTxtCategoria().setSelectedItem(null);
		vistaproducto.getTxtIngredientes().setSelectedItem(null);
		
		for(int i=0; i<vistaproducto.getTabla().getRowCount(); i++)
			for(int f=0; f<4; f++)
				vistaproducto.getTabla().setValueAt("", i, f);
		
	}
	
	public ControladorProducto(VistaProducto vistaproducto){
		
		super();
		this.vistaproducto = vistaproducto;
		this.modeloproducto = new ModeloProductos();
		this.modelocategoria = new ModeloCategoria();
		this.modeloingrediente = new ModeloIngredientes();
		this.modelodetalleproducto = new ModeloDetalleProducto();
	}
	
	
	public void windowClosing(WindowEvent e){
		vistaproducto.dispose();
	}
	
	public void windowOpened(WindowEvent arg0) {
		//System.out.println("entro a cargar");
		cargarCategoria();
		vistaproducto.getTxtCategoria().setSelectedItem(null);//   .getTxtTipoEjemplar().setSelectedItem(null);
		cargarIngredientes();
		vistaproducto.getTxtIngredientes().setSelectedItem(null);
	}

	
	
	public void mostrarInfo(ModeloProductos producto){
		
		limpiar2();
		vistaproducto.getTxtCodigo().setText(producto.getId());
		vistaproducto.getTxtDescripcion().setText(producto.getDescripcion());
		vistaproducto.getTxtPrecio().setText(Double.toString(producto.getPrecio()));
		vistaproducto.getTxtCosto().setText(Double.toString(producto.getCosto()));
		vistaproducto.getTxtDescripcion().setText(producto.getDescripcion());
				
		ModeloCategoria actual = modelocategoria.consultarCategoria(producto.getId_categoria());
		if (actual != null){
			
			ObjetoCombo objetoCombo = new ObjetoCombo(actual.getId(),actual.getDescripcion());		
			
			for (int i=0;i<vistaproducto.getTxtCategoria().getItemCount();i++){
			
				vistaproducto.getTxtCategoria().setSelectedIndex(i);							
				ObjetoCombo a =(ObjetoCombo) vistaproducto.getTxtCategoria().getSelectedItem();
				if (a.getCodigo().equals(objetoCombo.getCodigo())){
					break;
				}
			}					
		}else{
			vistaproducto.getTxtCategoria().setSelectedItem(null);
		}
		
		for (int i=0;i<producto.getVDetalle().size();i++){
			
				vistaproducto.getTabla().setValueAt(producto.getVDetalle().elementAt(i).getId_producto(), i, 0);
				vistaproducto.getTabla().setValueAt(producto.getVDetalle().elementAt(i).getId_ingrediente(), i, 1);
				
				ModeloIngredientes ingre = modeloingrediente.existe(producto.getVDetalle().elementAt(i).getId_ingrediente());
				
				vistaproducto.getTabla().setValueAt(ingre.getDescripcion(), i, 2);
				vistaproducto.getTabla().setValueAt(Integer.toString(producto.getVDetalle().elementAt(i).getCantidad()), i, 3);
				
				fila++;
			}
		
	}
	
		
	public void cargarCategoria(){
		
		ResultSet rs;
		rs = modelocategoria.listarCategorias();   //mTipoEjemplar.listarTipoEjemplar();
		try {
			
			while (rs.next()){
				ObjetoCombo objetoCombo = new ObjetoCombo(rs.getString("id"),rs.getString("descripcion"));
				vistaproducto.getTxtCategoria().addItem(objetoCombo);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public void cargarIngredientes(){
		
		ResultSet rs;
		
		
		rs = modeloingrediente.listar();
		
		try {
            
			while (rs.next()){
				
				ObjetoCombo objetoCombo = new ObjetoCombo(rs.getString("id"),rs.getString("descripcion"));
				vistaproducto.getTxtIngredientes().addItem(objetoCombo);
			}
			
		} catch (SQLException e) {
		
			e.printStackTrace();
		}

	}

	public void actionPerformed(ActionEvent ae) {
	
		String mensaje;
		ModeloProductos encontrado = null;
		
		int tipoMensaje=0;
		// BUSCAR
			if(ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnBuscar().getText())){
				buscar(encontrado);
				
			}
		
		//guardar
		
		if(ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnGuardar().getText())){
			
			guardar(encontrado);
					
		}
			
		if (ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnCancelar().getText())){
				Limpiar();
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnModificar().getText())){
			
			modificar(encontrado);
		}
		
		
		
		if (ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnIncluir().getText())){
			incluirIngrediente();
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnSalir().getText())){
			vistaproducto.dispose();
		}
		
		if (ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnFila().getText())){
			
			eliminarFila();
			
		}
		
		//ELIMINAR
		if (ae.getActionCommand().equalsIgnoreCase(vistaproducto.getBtnEliminar().getText())){
			
			eliminar();
		}
		
	}
	
	public void eliminarFila()
	{
		fila--;
		int filaE=vistaproducto.getTabla().getSelectedRow();
		vistaproducto.getTxtEFila().setText(Integer.toString(filaE));
		vistaproducto.getTabla().setValueAt("", filaE,0);
		vistaproducto.getTabla().setValueAt("", filaE,1);
		vistaproducto.getTabla().setValueAt("", filaE,2);
		vistaproducto.getTabla().setValueAt("", filaE,3);
		
		int filaAux;
		for(int i=filaE; i<vistaproducto.getTabla().getRowCount();i++)
		{
			filaAux=i+1;
			if (filaAux< vistaproducto.getTabla().getRowCount()){
			
				if(vistaproducto.getTabla().getValueAt(filaAux,2)!="")
				{
					vistaproducto.getTabla().setValueAt(vistaproducto.getTabla().getValueAt(filaAux, 0),i,0);
					vistaproducto.getTabla().setValueAt(vistaproducto.getTabla().getValueAt(filaAux, 1),i,1);
					vistaproducto.getTabla().setValueAt(vistaproducto.getTabla().getValueAt(filaAux, 2),i,2);
					vistaproducto.getTabla().setValueAt(vistaproducto.getTabla().getValueAt(filaAux, 3),i,3);
				
				}else{
					vistaproducto.getTabla().setValueAt("",i,0);
					vistaproducto.getTabla().setValueAt("",i,1);
					vistaproducto.getTabla().setValueAt("",i,2);
					vistaproducto.getTabla().setValueAt("",i,3);
				}
			}
		}
		
	}
	
	private void buscar(ModeloProductos encontrado)
	{
		encontrado = modeloproducto.buscarProducto(vistaproducto.getTxtCodigo().getText());
		String mensaje;
		int tipoMensaje;
		
		if (encontrado == null)
		{
			mensaje = "No se econtro el codigo";
			tipoMensaje = JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema la <<Guapa>>    Comida Rapida",
					  tipoMensaje);
			Limpiar();
			
		}else
		{
			
			mostrarInfo(encontrado);
			
		}
	}
	
	
	private void llenarVector(Vector<ModeloDetalleProducto> vDetalle){
		
	int fila=vistaproducto.getTabla().getRowCount();
	
	for (int i=0;i<fila;i++){
		
			if(vistaproducto.getTabla().getValueAt(i,2).toString() != ""){
			
				vistaproducto.getTabla().setValueAt(vistaproducto.getTxtCodigo().getText(), i, 0);
				String datopro = vistaproducto.getTxtCodigo().getText();
				String datoing = vistaproducto.getTabla().getValueAt(i,1).toString();
				int cant = Integer.parseInt(vistaproducto.getTabla().getValueAt(i,3).toString());
				
				ModeloDetalleProducto actual = new ModeloDetalleProducto (datopro, cant, datoing);
				vDetalle.addElement(actual);
				
			}
		}
		
		
	}
	
	public void guardar(ModeloProductos encontrado)
	{
		
		int tipoMensaje=0;
		String mensaje="";
		Vector<ModeloDetalleProducto> vDetalle = new Vector();
		ObjetoCombo objetoCombo = (ObjetoCombo) vistaproducto.getTxtCategoria().getSelectedItem();		
		llenarVector(vDetalle);
		
		if(vDetalle.size()>0)
		{
			ModeloProductos encontrada;		
			ModeloProductos modeloproducto = new ModeloProductos(vistaproducto.getTxtCodigo().getText(), objetoCombo.getCodigo(), vistaproducto.getTxtDescripcion().getText(), Double.parseDouble(vistaproducto.getTxtPrecio().getText()), Double.parseDouble(vistaproducto.getTxtCosto().getText()), vDetalle);
			
				encontrada = modeloproducto.existe(modeloproducto.getId());
								
				if (encontrada == null){
					
					modeloproducto.registar(modeloproducto);
					mensaje="Producto ingresado exitosamente";
					tipoMensaje = JOptionPane.INFORMATION_MESSAGE;
					JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema <<La Guapa>>    Comida Rapida",tipoMensaje);
					//Limpiar();
				
				}else{
					
					mensaje = "El producto que esta intentando ingresar ya se encuentra registrado";
					tipoMensaje = JOptionPane.WARNING_MESSAGE;
					JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema <<La Guapa>>    Comida Rapida",tipoMensaje);
				}
		}
		else
		{
			mensaje = "Debe ingresar al menos un ingrediente";
			tipoMensaje = JOptionPane.WARNING_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(), mensaje,"Sistema <<La Guapa>>    Comida Rapida",tipoMensaje);
		}
			
	}
	
	
	private void modificar(ModeloProductos encontrado){
		
		String mensaje;
		int tipoMensaje;
		Vector<ModeloDetalleProducto> vDetalle = new Vector();
		
		modeloproducto.setId(vistaproducto.getTxtCodigo().getText());
		modeloproducto.setDescripcion(vistaproducto.getTxtDescripcion().getText());		
		ObjetoCombo objetoCombo = (ObjetoCombo) vistaproducto.getTxtCategoria().getSelectedItem();
		llenarVector(vDetalle);
		
		//ModeloProductos actual = new ModeloProductos (vistaproducto.getTxtCodigo().getText(), vistaproducto.getTxtDescripcion().getText(), Double.parseDouble(vistaproducto.getTxtPrecio().getText()), Double.parseDouble(vistaproducto.getTxtCosto().getText()),objetoCombo.getCodigo());
		
		ModeloProductos modeloproducto = new ModeloProductos(vistaproducto.getTxtCodigo().getText(), objetoCombo.getCodigo(), vistaproducto.getTxtDescripcion().getText(), Double.parseDouble(vistaproducto.getTxtPrecio().getText()), Double.parseDouble(vistaproducto.getTxtCosto().getText()), vDetalle);
		
		
		ModeloProductos encontrada= modeloproducto.existe(modeloproducto.getId());
		
		if (encontrada == null){
			
			mensaje = "Error La categoria no modificada";
			tipoMensaje = JOptionPane.WARNING_MESSAGE;
			Limpiar();					

		}else{
		
			modeloproducto.modificar();
			mensaje="Producto Modificado";
			tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
			Limpiar();
		}
		
	}
	
	private void incluirIngrediente(){
		
		if (vistaproducto.getTxtIngredientes().getSelectedItem()!=null){
			
				if (!vistaproducto.getTxtcantidad().getText().trim().equals("")){
					
					if (Integer.parseInt(vistaproducto.getTxtcantidad().getText()) > 0){
						
						ObjetoCombo oC = (ObjetoCombo) vistaproducto.getTxtIngredientes().getSelectedItem();		
						vistaproducto.getTabla().setValueAt(oC.getCodigo(), fila, 1);
						vistaproducto.getTabla().setValueAt(oC.getNombre(), fila, 2);
						vistaproducto.getTabla().setValueAt(vistaproducto.getTxtcantidad().getText(), fila, 3);
						fila++;
					
					}else {
						
						String mensaje="Disculpe, inserte una cantidad mayor a cero (0)";
						int tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
						JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
					}
					
				}else {
					
					String mensaje="Disculpe, inserte una cantidad mayor a cero (0)";
					int tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
					JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
				}
		}else {
			
			String mensaje="Disculpe, debe seleccionar un ingrediente";
			int tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
		}
	}
	
	private void eliminar()	
	{
		String mensaje="";
		int tipoMensaje;
		
		modeloproducto.setId(vistaproducto.getTxtCodigo().getText());
		modeloproducto.setDescripcion(vistaproducto.getTxtDescripcion().getText());	
		ObjetoCombo objetoCombo = (ObjetoCombo) vistaproducto.getTxtCategoria().getSelectedItem();
		
		ModeloProductos actual = new ModeloProductos (vistaproducto.getTxtCodigo().getText(), vistaproducto.getTxtDescripcion().getText(), Double.parseDouble(vistaproducto.getTxtPrecio().getText()), Double.parseDouble(vistaproducto.getTxtCosto().getText()),objetoCombo.getCodigo() );		
		ModeloProductos encontrada=modeloproducto.existe(actual.getId());
		
		if (encontrada == null){
			mensaje = "Error: producto no Eliminado";
			tipoMensaje = JOptionPane.WARNING_MESSAGE;
			Limpiar();					

		}else{
			modeloproducto.eliminar();
			mensaje="Registro Eliminado";
			tipoMensaje= JOptionPane.INFORMATION_MESSAGE;
			JOptionPane.showMessageDialog(new JPanel(),mensaje,"Sistema <<La Guapa>>    Comida Rapida",	tipoMensaje);
			Limpiar();
		}
	}
	
}
